
#include <iostream>
#include <string>
#include <memory>
//#include "TcpSocket.hpp"
//#include "Protocol_1.hpp"
#include "Servecal.hpp"
#include "TcpServe.hpp"

void Usage(const std::string& proc)
{
    std::cout << std::endl;
    std::cout << " Usage: " << proc << "port[1024+] " << std::endl;
    std::cout << std::endl;
}

int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        Usage(argv[0]);
        exit(1);
    }
    //……
    uint16_t port = std::stoi(argv[1]); //拿到端口号
    ServeCal cal; //定义计算器方法类
    std::shared_ptr<TcpServe> ptr(new TcpServe(port, std::bind(&ServeCal::Calculate, &cal, std::placeholders::_1)));
    ptr->Init();
    ptr->Start();
    return 0;
}

// int main()
// {
//     /* 测试Request的序列化和反序列化 */
//     // Request q1(100, 112, '+');
//     //std::string temp;
//     // q1.Serialize(&temp);
//     // std::cout << temp << std::endl;

//     // Request q2;
//     // q2.Deserialize(temp);
//     // q2.DebugPrint();

//     // std::string show1;
//     // std::string show2;

//     // Enpackage(temp, &show1);
//     // std::cout << show1 << std::endl;
    
//     // Depackage(show1, &show2);
//     // std::cout << show2 << std::endl;


//     /* 测试Response的序列化和反序列化 */
//     // Response r1(60, 0);
//     // std::string res;
//     // r1.Serialize(&res);
//     // std::cout << res << std::endl;

//     // Response r2;
//     // r2.Deserialize(res);
//     // r2.DebugPrint();

//     // std::string show1;
//     // std::string show2;

//     // Enpackage(res, &show1);
//     // std::cout << show1 << std::endl;
    
//     // Depackage(show1, &show2);
//     // std::cout << show2 << std::endl;

//     /* 测试package的分割 */
//     // std::string test = "5\n1 + 1\n5\n2 + 2\n";
//     // std::string ret;
//     // std::cout << test << std::endl;
    
//     // Depackage(test, &ret);
//     // std::cout << test << std::endl;
//     // std::cout << ret << std::endl;

//     return 0;
// }

// int main()
// {
//     ServeCal cal;
//     std::string test = "5\n1 + 1\n5\n2 + 2\n";

//     std::cout << cal.Calculate(test);
//     std::cout << "---------------------" << std::endl;

//     std::cout << test ;
//     std::cout << "---------------------" << std::endl;

//     std::cout << cal.Calculate(test);
//     std::cout << "---------------------" << std::endl;

//     std::cout << test;
//     std::cout << "---------------------" << std::endl;


//     return 0;
// }